home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI / LEZIONE2a.s < prev    next >
Text File  |  1994-10-30  |  18KB  |  375 lines

  1.  
  2. ; Lezione2a.s - Questo programmino registra nel byte denominato col nome
  3. ; "contatore" il numero di volte che viene premuto il tasto destro, o meglio
  4. ; quanto e' stato premuto, infatti quando lo si tiene premuto viene continua-
  5. ; mente incrementato; per usecire si deve premere il tasto sinistro.
  6.  
  7.  Inizio:
  8.     btst    #2,$dff016    ; POTINP - tasto destro del mouse premuto?
  9.     beq.s    aggiungi    ; se si, vai ad "aggiungi"
  10.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  11.     bne.s    inizio        ; se no, torna ad Inizio e ripeti tutto
  12.     rts            ; se si invece ESCI!
  13.  
  14. aggiungi:
  15.     move.b    contatore,$dff180 ; metti il valore di CONTATORE in COLOR0
  16.     addq.b    #1,contatore    ; Aggiungi 1 al valore di contatore
  17.     bra.s    inizio        ; torna ad inizio e ripeti
  18.  
  19. contatore:
  20.     dc.b    0        ; questo e' il byte che terra' il conto...
  21.  
  22.     END    ; Con END si determina la fine del listato, le parole
  23.           Sotto l'END non sono considerate, e' come fossero tutte
  24.           precedute dal ; (Punto e virgola)
  25.  
  26. NOTA: POTINP e' il nome del registro $dff016. Il nome in maiuscolo dopo
  27.       il punto e virgola si diferisce sempre al nome del registro $dffxxx
  28. In questo listato si nota l'uso delle label sia per rappresentare delle
  29. istruzioni, (bne.s inizio, bra.s inizio), sia per rappresentare un byte
  30. di dati (addq.b #1,contatore). Non c'e' differenza tra la label Inizio:
  31. e la label contatore:, sono entrambe label, ossia NOMI CHE IDENTIFICANO UN
  32. DATO PUNTO DEL PROGRAMMA, SIA ESSO UN BYTE, UN MOVE O QUALSIASI ALTRA COSA,
  33. CHE SERVE PER FAR ESEGUIRE LE ISTRUZIONI CHE HA SOTTO, QUANDO PRECEDE DELLE
  34. ISTRUZIONI (SI FARA' UN BNE LABEL, AD ESEMPIO), O A LEGGERE/SCRIVERE IL
  35. BYTE, LA WORD O LA LONGWORD CHE PRECEDE. Ho notato che molti trovano
  36. difficolta' ad entrare in questa logica. Facciamo degli esempi per chiarire
  37. il ruolo delle LABEL: immaginate di avere un orticello rettangolare
  38. recintato, con un viottolo che lo attraversa nel mezzo. Dopo averlo
  39. vangato decidete di seminarci delle fragole, dell'insalata, del basilico e
  40. del prezzemolo, quindi lo dividete in 4 rettangoli di diversa grandezza e
  41. seminate. Per sapere da dove inizieranno a crescere i diversi ortaggi si
  42. usano spesso quelle etichette di plastica con una punta da inserire nel
  43. terreno, le avete presenti??? Allora piantiamole: l'orto ora ha 4 etichette
  44. che spuntano dal terreno, ognuna con scritto sopra il nome dell'ortaggio: su
  45. una troveremo FRAGOLE:, in un'altro INSALATA:, poi BASILICO: e PREZZEMOLO:.
  46. Da notare che abbiamo messo le etichette nel punto dove inizia un tipo
  47. di ortaggio, e di conseguenza dove finisce quello precedente:
  48.  
  49.  
  50. FRAGOLE:    INSALATA:    BASILICO:    PREZZEMOLO:
  51.   \/         \/           \/             \/
  52.   ................oooooooooooooooooo^^^^^^^^^^^^^^^^^^_-_-_-_-_-_-_-_-_-_-_-_
  53.  
  54.  
  55. Se considerate le fragole come i "......", l'insalata come i "ooooo", il
  56. basilico come i "^^^^^^^" e il prezzemolo come i "-_-_-_-_", noterete
  57. che quando scrivo "BNE INSALATA" intendo VAI ALL'ETICHETTA INSALATA, non
  58. "buttati nel mezzo dell'insalata" o "vai in direzione dell'insalata", ma
  59. proprio "VAI AL CARTELLINO INFILATO NEL TERRENO IN CUI C'E' SCRITTO INSALATA,
  60. ED ESEGUI LE ISTRUZIONI DOPO ESSO, in questo caso si eseguirebbero i "oooo".
  61. Nel caso che usi la label in questo modo:
  62.  
  63.     addq.b    #1,BASILICO
  64.  
  65. Non faccio altro che aggiungere 1 seme nel primo byte dopo L'ETICHETTA, che
  66. non ha cambiato funzione! Non indica contenuti o altre stranezze!!! Indica
  67. sempre un punto della memoria, ossia del listato, che e' l'inizio del basilico.
  68. Proviamo a fare un MOVE.B FRAGOLE,BASILICO
  69.  
  70. FRAGOLE:    INSALATA:    BASILICO:    PREZZEMOLO:
  71.   \/         \/           \/             \/
  72.   ................oooooooooooooooooo.^^^^^^^^^^^^^^^^^_-_-_-_-_-_-_-_-_-_-_-_
  73.  
  74.   |                    |
  75.    \--> ----> ----> ----> ----> --->
  76.  
  77. Come noterete un ".", ossia il byte dopo fragole e' stato copiato nel byte
  78. dopo BASILICO:, proviamo ira un MOVE.W INSALATA,FRAGOLE
  79.  
  80. FRAGOLE:    INSALATA:    BASILICO:    PREZZEMOLO:
  81.   \/         \/           \/             \/
  82.   oo..............oooooooooooooooooo.^^^^^^^^^^^^^^^^^_-_-_-_-_-_-_-_-_-_-_-_
  83.  
  84.   ||             ||
  85.    \<--- <--- <--/
  86.  
  87. Abbiamo spostato i primi 2 "oo" che erano dopo INSATATA: nei primi 2 byte
  88. dopo FRAGOLE:
  89.  
  90. Se si volesse leggere o scrivere da un punto intermedio tra le LABEL, bastera'
  91. aggiungerne un'altra dove si desidera: per mettere 4 bytes di INSALATA
  92. nel centro del basilico dovremo fare una nuova LABEL denominata BAS2: nel
  93. punto prestabilito, dopodiche' faremo un MOVE.L INSALATA,BAS2
  94.  
  95.  
  96. Prima:
  97.  
  98. FRAGOLE:    INSALATA:    BASILICO: BAS2:    PREZZEMOLO:
  99.   \/         \/           \/       \/         \/
  100.   oo..............oooooooooooooooooo.^^^^^^^^^^^^^^^^^_-_-_-_-_-_-_-_-_-_-_-_
  101.  
  102.  
  103. Dopo:
  104.  
  105. FRAGOLE:    INSALATA:    BASILICO: BAS2:    PREZZEMOLO:
  106.   \/         \/           \/       \/         \/
  107.   oo..............oooooooooooooooooo.^^^^^^^oooo^^^^^^_-_-_-_-_-_-_-_-_-_-_-_
  108.  
  109.           ||||                ||||
  110.            \ ----> ----> ----> -----> /
  111.  
  112. Abbiamo spostato i primi 4 bytes che si trovavano dopo INSALATA: nei primi 4
  113. bytes dopo BAS2:
  114.  
  115. Il funzionamento e' lo stesso dello spostamento che avviene usando indirizzi
  116. reali, come gia' spiegato nella LEZIONE1 (CANE GATTO>NEO CANEO), soltanto che
  117. invece di operare con gli indirizzi, in cui ogni seme ha un indirizzo, si
  118. mettono delle etichette solo agli indirizzi che interessano:
  119.  
  120. Usando gli indirizzi:
  121.  
  122. FRAGOLE:    INSALATA:    BASILICO:    PREZZEMOLO:
  123.   \/         \/           \/             \/
  124.   ................oooooooooooooooooo^^^^^^^^^^^^^^^^^^_-_-_-_-_-_-_-_-_-_-_-_
  125.   123456789012345678901234567890123456789012345678901234567890123456789012345
  126.              11111111112222222222333333333344444444445555555555666666
  127.  
  128. Muovendosi con gli indirizzi, si possono copiare 4 byte di insalata da ogni
  129. posizione, ad esempio dalla n.15, e metterlo nella n.55: MOVE.L 15,55
  130.  
  131.  
  132. FRAGOLE:    INSALATA:    BASILICO:    PREZZEMOLO:
  133.   \/         \/           \/             \/
  134.   ................oooooooooooooooooo^^^^^^^^^^^^^^^^^^_-_-_-_-_-_-oooo_-_-_-_
  135.   123456789012345678901234567890123456789012345678901234567890123456789012345
  136.              11111111112222222222333333333344444444445555555555666666
  137.               \---> ---> ---> ---> ---> ---> ---> --->/
  138.  
  139. La stessa operazione si puo' pero' fare mettendo una label alla posizione 15
  140. e un'altra alla posizione 55, facendo poi "move.l LABEL1, LABEL2"
  141.  
  142.             LABEL1:                    LABEL2:
  143.              \/                     \/
  144.   ................oooooooooooooooooo^^^^^^^^^^^^^^^^^^_-_-_-_-_-_-oooo_-_-_-_
  145.               \---> ---> ---> ---> ---> ---> ---> --->/
  146.  
  147. Come mai si e' preferito usare le LABEL piuttosto che gli indirizzi?
  148. SEMPLICE! Perche' usando gli indirizzi, se avessimo inserito delle cose
  149. tra l'insalata e il basilico, la destinazione non sarebbe stata piu' 55,
  150. ma un altro numero, per esempio 80, e avremmo dovuto cambiare tutti i
  151. numeri spostandoli in avanti per farci entrare il nuovo pezzo inserito.
  152. Invece, con le label, se inseriamo qualcosa tra l'una e l'altra non ci
  153. comporta modifiche, perche' l'ASMONE calcola ogni volta l'indirizzo della
  154. label.
  155.  
  156. Provate ad eseguire questo prog, la prima volta senza premere il tasto destro,
  157. ma solo il tasto sinistro per uscire: il byte CONTATORE in questo caso e'
  158. rimasto 0, come si puo' verificare con il comando M, che visualizza i valori
  159. effettivi contenuti negli indirizzi di memoria in formato di bytes in
  160. esadecimale (indicato con il numero della locazione, ad esempio M $50000, o
  161. il nome di una label): facendo M contatore si otterra' uno ZERO, seguito
  162. da altri numeri che corrisponderanno ai byte seguenti in memoria che non ci
  163. interessano. (per avanzare in memoria premete varie volte return, per terminare
  164. premete il tasto ESC - i byte sono ovviamente in formato ESADECIMALE)
  165. Riassemblate con A ed eseguitelo una seconda volta, questa
  166. volta premendo il tasto destro prima di uscire (col sinistro): rifacendo
  167. "M contatore" si otterra' un numero diverso da zero, che corrispondera'
  168. al numero di cicli in cui il tasto destro del mouse era premuto, infatti
  169. il ciclo viene eseguito molto velocemente dal processore e anche premendo il
  170. tasto destro per un istante si ottengono numeri superiori a 1.
  171. Va notato che il contatore in questione e' lungo un byte, quindi puo'
  172. raggiungere un valore massimo di 255, ossia $FF, ossia %11111111 in binario,
  173. cioe' tutti gli otto bit che formano il byte ACCESI (1), dopodiche' il numero
  174. ripartira' da zero (se si continua ad addizionare). ($ff+1 = 0, $ff+2 = 1...)
  175. Il passo avanti di questo programmino rispetto al primo e' che la struttura
  176. dei salti condizionati e' piu' complessa (E mi raccomando di non andare avanti
  177. fino a che non la avete capita!), inoltre viene usato un byte come variabile.
  178. Questo byte nominato CONTATORE non solo viene scritto, ma viene anche letto
  179. per scriverne il valore nel $dff180, ossia il COLOR0: di qui si intuisce come
  180. possano essere gestite molte VARIABILI, ossia bytes, words o longwords in
  181. cui vengono scritti e letti numeri utili al programma, ad esempio il numero
  182. delle vite del PLAYER 1, la sua energia, i suoi punti, eccetera.
  183. L'uso delle LABEL e' utile al programmatore ma il programma una volta
  184. assemblato, diviene una serie di bytes, che se sono letti dal 68000
  185. vengono interpretati come istruzioni che si riferiscono ad indirizzi diretti:
  186. per verificare cio, assemblate il programma e fate un D Inizio...
  187. Verra' cosi' visualizzato il programma assemblato in memoria nella sua vera
  188. forma, in cui al posto delle label compaiono gli indirizzi EFFETTIVI: come
  189. osservate la prima colonna di numeri a sinistra sono gli indirizzi della
  190. memoria dove stiamo leggendo, la seconda colonna di numeri sono i comandi
  191. nella loro forma REALE in memoria, cioe' sequenze di bytes (ad esempio la
  192. prima riga BTST #2,$dff016 in memoria diventa 0839000200dff016, in cui
  193. $0839 significa BTST, 0002 e' il #2, 00dff016 e' l'indirizzo interessato)...
  194. la terza colonna, quella a destra, riporta il DISASSEMBLATO, ossia fa il
  195. contrario di quando assembla: trasforma i BYTES in ISTRUZIONI (quando si
  196. preme A (assembla) invece vengono trasformate istruzioni dal formato MOVE,ADD,
  197. BNE,BTST... in BYTES). Leggendo noterete subito che le label sono sostituite
  198. dagli indirizzi reali dove si trovano routines o variabili.
  199. Come ulteriore verifica del fatto che le istruzioni diventano numeri ben
  200. precisi, sostituite la linea:
  201.  
  202.     btst    #2,$dff016    ; POTINP - tasto destro del mouse premuto?
  203.  
  204. Con la linea equivalente:
  205.  
  206.     dc.l    $08390002,$00dff016
  207.  
  208. oppure:
  209.  
  210.     dc.w    $0839,$0002,$00df,$f016
  211.  
  212. oppure:
  213.  
  214.     dc.b    $08,$39,$00,$02,$00,$df,$f0,$16
  215.  
  216. In tutti i casi il risultato e' un 0839000200dff016 in memoria, che il 68000
  217. interpreta come "btst #2,$dff016", cioe' "il bit 2 di $dff016 e' a zero?".
  218.  
  219. Se la variabile fosse stata una WORD anziche' un BYTE, il listato dovrebbe
  220. essere modificato cosi':
  221.  
  222. Inizio:
  223.     btst    #2,$dff016    ; POTINP - tasto destro del mouse premuto?
  224.     beq.s    aggiungi    ; se si, vai ad "aggiungi"
  225.     btst    #6,$bfe001    ; stato sinistro del mouse premuto?
  226.     bne.s    inizio        ; se no, torna ad Inizio e ripeti tutto
  227.     rts            ; se si invece ESCI!
  228.  
  229. aggiungi:
  230.     move.w    contatore,$dff180 ; COLOR0 - Usare .w invece che .b
  231.     addq.W    #1,contatore    ; usare ADDQ.W invece che ADDQ.B!!!
  232.     bra.s    inizio
  233.  
  234. contatore:
  235.     dc.W    0        ; dc.w invece di dc.b (lo stesso che dc.b 0,0)
  236.  
  237. In questo caso il numero massimo contenibile da una word prima che ricominci
  238. da capo e' $FFFF, ossia 65535, ossia %1111111111111111.
  239.  
  240. Se si volesse usare una LONGWORD per CONTATORE:, il numero massimo prima
  241. di riazzerarsi sarebbe $FFFFFFFF , ossia qualche miliardo, ma bisogna
  242. considerare che il bit alto (ossia il trentunesimo nel caso della longword)
  243. e' usato per il segno del numero: provate a fare ?$0FFFFFFF e otterrete
  244. un 268 milioni e rotte, ed in binario si nota che i quattro bit piu' alti
  245. del numero (ossia i primi quattro dopo il %) sono a zero. il massimo numero
  246. positivo che si puo' ottenere e' $7FFFFFFF ossia in binario:
  247.     ;10987654321098765432109876543210    ; numero di bit da 0 a 31
  248.     %01111111111111111111111111111111
  249. Infatti il bit 31 (che sarebbe il trentaduesimo, ma e' il trentuno perche'
  250. conta anche lo zero) e' a ZERO, mentre gli altri sono tutti ad 1.
  251. Se si fa ?$7FFFFFFF+1 si ottiene -2 miliardi e rotte, e mano mano che si
  252. aumenta il numero si avvicina allo zero (-1 miliardo, -100 milioni, -10 etc)
  253. infatti se si fa un ?-1 si ottiene $FFFFFFFF, con ?-2 invece $FFFFFFFE.
  254.  
  255. Questo sistema del bit alto usato come segno puo' essere valido anche per
  256. i byte e le word: per i byte, un move.b #-1,$50000 si puo' scrivere anche
  257. move.b $FF,$50000 quindi il massimo numero positivo diventerebbe:
  258.  %01111111 , ossia $7f, 127. Per le word il massimo numero positivo diventa
  259.  %0111111111111111, ossia $7FFF, ossia 32767. Comunque e seconda di come si
  260. fa il programma i numeri possono essere usati come numeri positivi e negativi
  261. o come numeri assoluti.
  262.  
  263. Provate a cambiare il listato in modo che CONTATORE: sia una word, come
  264. descritto sopra: Potete usare le funzioni dell'editor di ASMONE, il
  265. cosiddetto TAGLIA ed INCOLLA: per "ritagliare" un pezzo di testo e
  266. copiarlo in un altro punto, premete insieme il tasto Amiga destro+b
  267. all'inizio della parte di testo che volete copiare; in questo caso selezionate
  268. il sorgente modificato a WORD sotto la linea "essere modificato cosi':"
  269. posizionandovi appunto sopra la label Inizio: e premendo Amiga+b. Ora
  270. potete selezionare il blocco (che vi apparira' in negativo), spostandovi in
  271. basso con il cursore. Arrivati sotto il Dc.W 0 premete Amiga+c, e il pezzo di
  272. testo comprendente il listato andra' in memoria. Ora andate in cima al
  273. listato a colpi di CURSORE SU+SHIFT, e premete Amiga+i ...
  274. Magicamente apparira' una copia del testo che avevate selezionato prima.
  275. A questo punto basta mettere un END (distanziato dall'inizio della riga con
  276. degli spazi, o meglio con un TAB) sotto il DC.W 0 per escludere il primo
  277. sorgente con CONTATORE: lungo un byte. Assemblate e Jumpate.
  278.  
  279. P.S: Non fate caso, per ora, a quella sfilza di numeri, a volte evidenziati,
  280.      che compaiono dopo ogni "J", il loro significato verra' spiegato dopo.
  281.  
  282. Subito noterete la differenza di lampeggiamento dello schermo quando premete
  283. il tasto destro; provate a fare un M CONTATORE adesso:
  284. ora e' una WORD, quindi saranno valide le prime 2 coppie di numeri,
  285. ossia i primi 2 bytes... se compariranno ad esempio 00 30 significa che
  286. l'ADDQ.W #1,CONTATORE e' stato eseguito $30 volte, ossia 48 volte; un valore
  287. di 02 5e significherebbe $25e volte, ossia 606 volte.
  288.  
  289. Se non siete esperti di editor di testi fate un po di prove di TAGLIA E INCOLLA
  290. scopiazzando e inserendo parti di questo testo qua' e la', e considerate che
  291. se una volta selezionato un blocco con Amiga+b invece di copiarlo in memoria
  292. con Amiga+c, premete Amiga+x il blocco selezionato sara' anche cancellato, ma
  293. premendo Amiga+i si potra' reinserire da un'altra parte. Vi assicuro che
  294. programmare e' tutto un TAGLIA e INCOLLA, in quanto questo trucchetto permette
  295. di risparmiare il tempo di riscrivere parti di programma simili, che invece
  296. possono essere copiate e modificate velocemente.
  297.  
  298. Bisogna districarsi bene nella numerazione binaria per poter lavorare, infatti
  299. anche molti registri hardware sono BITMAPPED, ossia ogni bit corrisponde ad
  300. una funzione. Ecco una tabella per rendere piu' chiara la differenza:
  301.  
  302. ESADECIMALE    BINARIO   DECIMALE
  303.         0      %00000    0
  304.         1      %00001    1
  305.         2      %00010    2
  306.         3      %00011    3
  307.         4      %00100    4
  308.         5      %00101    5
  309.         6      %00110    6
  310.         7      %00111    7
  311.         8      %01000    8
  312.         9      %01001    9
  313.        $A      %01010    10
  314.        $B      %01011    11
  315.        $C      %01100    12
  316.        $D      %01101    13
  317.        $E      %01110    14
  318.        $F      %01111    15
  319.       $10      %10000    16
  320.       $11      %10001    17
  321.       $12      %10010    18
  322.       ...       ...      ...
  323.  
  324. Come vedete il binario segue una logica semplice di riempimento con gli 1 fino
  325. a che non si giunge a 11, 111, 1111, 11111, 111111, eccetera, cioe' fino a che
  326. non scatta la cifra seguente: dopo %011 c'e' %0100, dopo %0111 c'e' %01000,
  327. dopo %01111 c'e' %010000, dopo %011111 c'e' %0100000 e cosi' via.
  328. Va ricordato che i numeri in formato esadecimale sono preceduti dal segno del
  329. dollaro $, mentre quelli binari sono preceduti dal segno di percentuale %.
  330. I numeri in formato normale decimale invece non devono essere preceduti da
  331. nessun segno. Se per esempio scriviamo 9 o $9, intendiamo sempre 9, ma se
  332. invece scriviamo 10 o $10 intendiamo 10 in decimale o 16 in esadecimale!
  333. Ricordatevi dunque che dopo il 9 un $ in piu' o in meno cambia tutto.
  334. Non e' importante saper convertire a memoria i numeri, quello non serve perche'
  335. basta usare il comando "?" per eseguire qualsiasi operazione o conversione,
  336. infatti il risultato lo da in tutti i formati, decimale, esadecimale, binario
  337. e ASCII, ossia in forma di CARATTERI. Infatti i caratteri come "abcd" non sono
  338. altro che bytes, che secondo lo standard ASCII simile nei vari computers
  339. corrispondono a certi caratteri, ad esempio "a"= $61, mentre "A"= $41.
  340. Potete verificarlo facendo un ?"a", oppure un ?$61 dalla linea comandi.
  341.  
  342. NOTA: Il .s al BNE significa SHORT, ossia "corto" (equivalente a .b)
  343. anziche' .s, oppure .w quando la label a cui si riferisce e' piu' lontana.
  344. Provate sempre a mettere il .s al BNE, e vedrete che se la label indicata
  345. dopo il beq.s o il bne.s e' troppo distante (piu' di 127 bytes), viene corretto
  346. dall'assembllatore in .w. Per verificarlo fate questa modifica:
  347.  
  348. Inizio:
  349.     btst    #2,$dff016    ; POTINP - tasto destro del mouse premuto?
  350.     beq.s    aggiungi    ; se si, vai ad "aggiungi"
  351.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  352.     bne.s    inizio        ; se no, torna ad Inizio e ripeti tutto
  353.     rts            ; se si invece ESCI!
  354.  
  355.     dcb.b    200,0        ; questa direttiva sara' spiegata in
  356.                 ; seguito, in questo caso mette 200
  357.                 ; bytes $00 in memoria, aumentando la distanza
  358.                 ; fra le label Inizio: e aggiungi:
  359.  
  360. aggiungi:
  361.     move.b    contatore,$dff180 ; metti il valore di CONTATORE in COLOR0
  362.     addq.b    #1,contatore    ; Aggiungi 1 al valore di contatore
  363.     bra.s    inizio        ; torna ad inizio e ripeti
  364.  
  365. Assemblando, vedrete che l'assemblatore vi segnala dei FORCED TO WORD SIZE,
  366. infatti ha FORZATO A WORD i bne.s, proprio nel listato, perche' la distanza
  367. tra Inizio: e aggiungi: era maggiore di 128. Vi consiglio di mettere sempre
  368. il .s dopo i bra, bsr, beq, bne e simili, l'assemblatore correggera' quando
  369. serve. Si puo' anche mettere sempre .w, ma le istruzioni .s sono piu' veloci
  370. e occupano meno bytes. Per riprendere il concetto di LABEL discusso prima,
  371. questo del dcb.b 200,0 inserito e' un esempio lampante dell'utilita' delle
  372. LABEL, che ci hanno evitato di riscrivere la nuova posizione assunta da
  373. aggiungi:, ossia 200 bytes piu' avanti.
  374.  
  375.